package com.qm.console.component.util;

import com.alibaba.fastjson.JSONObject;

import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MysqlUtil {

    private String DBName;
    private String UserName;
    private String PassWord;
    private String Host;

    private Connection connection;
    private PreparedStatement pStatement;
    private ResultSet resultset;

    /**通过参数的构造器传入连接数据库所需要的数据
     * @param Host//主机的IP或者域名
     * @param DBName//所连接数据库的名称
     * @param UserName//数据库的用户名
     * @param PassWord//数据库的密码
     */
    public MysqlUtil(String Host,String UserName,String PassWord, String DBName) {
        this.Host=Host;
        this.DBName=DBName;
        this.UserName=UserName;
        this.PassWord=PassWord;
        getConnection();
    }

    //数据库的连接方法
    private void getConnection(){
        String URL="jdbc:mysql://"+Host+":3306/"+DBName;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connection=DriverManager.getConnection(URL, UserName, PassWord);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


    /**
     * 完成对数据库的增删改操作
     * @param sql sql语句
     * @param params，List集合
     * @return SQL语句执行成功返回true,否则返回false
     * @throws SQLException
     */
    public boolean addDeleteModify(String sql,List<Object>params) throws SQLException
    {
        int result = -1;//设置为
        pStatement = connection.prepareStatement(sql);  //填充占位符
        int index = 1; //从第一个开始添加
        if(params != null && !params.isEmpty())
        {
            for(int i = 0;i<params.size();i++)
            {
                pStatement.setObject(index++,params.get(i));//填充占位符
            }
        }
        result = pStatement.executeUpdate();//执行成功将返回大于0的数
        return  result>0 ? true : false;
    }


    /**
     * 数据库查询操作，返回单条记录
     * @param sql 语句
     * @param params 传入的占位符
     * @return 返回Map集合类型，包含查询的结果
     * @throws SQLException
     */
    public Map<String,Object> returnSimpleResult(String sql,List<Object>params) throws SQLException
    {
        Map<String, Object> map = new HashMap<String, Object>();
        int index = 1;//从1开始设置占位符
        pStatement = connection.prepareStatement(sql);
        if(params != null && !params.isEmpty()) /*判断参数是否为空*/
        {
            for(int i = 0;i<params.size();i++) /*循环填充占位符*/
            {
                pStatement.setObject(index++, params.get(i));
            }
        }
        resultset = pStatement.executeQuery(sql);
        /*  将查询结果封装到map集合*/
        ResultSetMetaData metaDate = resultset.getMetaData();//获取resultSet列的信息
        int columnLength = metaDate.getColumnCount();//获得列的长度
        while(resultset.next())
        {
            for(int i = 0;i<columnLength;i++)
            {
                String metaDateKey = metaDate.getColumnName(i+1);//获得列名
                Object resultsetValue = resultset.getObject(metaDateKey);//通过列名获得值
                map.put(metaDateKey, resultsetValue);//添加到map集合（以上代码是为了将从数据库返回的值转换成map的key和value）
            }
        }
        return map;
    }

    /**
     * 查询数据库，返回多条记录
     * @param sql 语句
     * @param params 占位符
     * @return list集合，包含查询的结果
     * @throws SQLException
     */
    public List<JSONObject> returnMultipleResult(String sql, List<Object> params) throws SQLException
    {
        List list = new ArrayList<>();
        int index = 1;
        pStatement = connection.prepareStatement(sql);
        if(params != null && !params.isEmpty())
        {
            for(int i = 0;i<params.size();i++)
            {
                pStatement.setObject(index++, params.get(i));
            }
        }
        //执行SQL语句
        resultset = pStatement.executeQuery();
        //封装resultset成map类型
        ResultSetMetaData metaDate = resultset.getMetaData();//获取列信息,交给metaDate
        int columnLength = metaDate.getColumnCount();
        while(resultset.next())
        {
            JSONObject item = new JSONObject();

            for(int i = 0;i<columnLength;i++)
            {
                String metaDateKey = metaDate.getColumnName(i+1);//获取列名
                Object resultsetValue = resultset.getObject(metaDateKey);
                item.put(metaDateKey, resultsetValue);
            }
            list.add(item);
        }
        return list;
    }

    //关闭数据库连接
    public void close(){
        if(resultset!=null){
            try {
                resultset.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(pStatement!=null) try {
            pStatement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

}
